css selector: Use a builtin to count bits
authorMatthias Clasen <mclasen@redhat.com>
Fri, 11 Sep 2015 00:42:58 +0000 (20:42 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Sat, 12 Sep 2015 15:24:43 +0000 (11:24 -0400)
gtk/gtkcssselector.c

index aa279b2adebc2698434b4341e2bdac810ae0cef9..66ab9368864c32f355516de3e7048f687f21664b 100644 (file)
@@ -746,15 +746,19 @@ gtk_css_selector_region_get_change (const GtkCssSelector *selector, GtkCssChange
   return previous_change | GTK_CSS_CHANGE_REGION;
 }
 
-static guint
+static inline guint
 count_bits (guint n)
 {
+#if defined(__GNUC__)
+  return (guint) __builtin_popcount (n);
+#else
   guint result = 0;
 
   for (result = 0; n != 0; result++)
     n &= n - 1;
 
   return result;
+#endif
 }
 
 static void
@@ -771,7 +775,7 @@ gtk_css_selector_region_add_specificity (const GtkCssSelector *selector,
 static guint
 gtk_css_selector_region_hash_one (const GtkCssSelector *a)
 {
-  return g_str_hash (a->region.name) ^ a->region.flags;
+  return GPOINTER_TO_UINT (a->region.name) ^ a->region.flags;
 }
 
 static int
@@ -825,7 +829,12 @@ static int
 comp_class (const GtkCssSelector *a,
             const GtkCssSelector *b)
 {
-  return a->style_class.style_class - b->style_class.style_class;
+  if (a->style_class.style_class < b->style_class.style_class)
+    return -1;
+  if (a->style_class.style_class > b->style_class.style_class)
+    return 1;
+  else
+    return 0;
 }
 
 DEFINE_SIMPLE_SELECTOR(class, CLASS, print_class, match_class, hash_class, comp_class, FALSE, TRUE, FALSE)